{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 一些python math模块运算示例"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Python求全排列："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "6\n"
     ]
    }
   ],
   "source": [
    "from math import factorial\n",
    "\n",
    "print(factorial(3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# numpy向量运算的例子"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 向量模、单位向量、向量夹角、以及投影的有关例子"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.1 例6）已知两点A(4,0,5)和B（7,1,3），求与AB向量方向相同的单位向量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3.7416573867739413\n",
      "The unit vector is: vector 0.802,0.267,-0.535)\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "\n",
    "pointA = np.array([4,0,5])\n",
    "pointB = np.array([7,1,3])\n",
    "\n",
    "vector = pointB - pointA\n",
    "module = np.linalg.norm(vector)\n",
    "print(module)\n",
    "\n",
    "print(\"The unit vector is: vector {:.3f},{:.3f},{:.3f})\".format(*(vector / module)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.1 例7）已知两点A(2,2,sqrt(2))和B（1,3,0），求与AB向量的模、方向余弦和方向角。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The module is: 2.0\n",
      "Orientation cosine values are: -0.500 0.500 and -0.707.\n",
      "Corresponding angles (in radians) are therefore: 2.094 1.047 2.356\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import math\n",
    "\n",
    "pointA = np.array([2,2,math.sqrt(2)])\n",
    "pointB = np.array([1,3,0])\n",
    "\n",
    "vector = pointB - pointA\n",
    "module = np.linalg.norm(vector)\n",
    "\n",
    "cosx = np.array(vector[0] / module)\n",
    "cosy = np.array(vector[1] / module)\n",
    "cosz = np.array(vector[2] / module)\n",
    "\n",
    "print(\"The module is:\", module)\n",
    "print(\"Orientation cosine values are: %.3f %.3f and %.3f.\" % (cosx, cosy, cosz))\n",
    "\n",
    "\"\"\"\n",
    "#If want exact degree value, enable those codes：\n",
    "angle_x = round(math.degrees(math.acos(cosx)), 2)\n",
    "angle_y = round(math.degrees(math.acos(cosy)), 2)\n",
    "angle_z = round(math.degrees(math.acos(cosz)), 2)\n",
    "\"\"\"\n",
    "\n",
    "# Those ones give angle values in radians.\n",
    "angle_x = round(math.acos(cosx), 3)\n",
    "angle_y = round(math.acos(cosy), 3)\n",
    "angle_z = round(math.acos(cosz), 3)\n",
    "\n",
    "print(\"Corresponding angles (in radians) are therefore:\", angle_x, angle_y, angle_z)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.1 例8）已知点A位于第一卦限（octant），向量OA与x轴和y轴夹角依次为math.PI / 3和math.PI / 4，且OA的模为6.求点A坐标。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The cordination of point A is: (3.000, 4.243, 3.000)\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "\n",
    "x_cos = math.cos(math.pi / 3)\n",
    "y_cos = math.cos(math.pi / 4)\n",
    "z_cos = math.sqrt(1.0 - pow(x_cos, 2) - pow(y_cos, 2))\n",
    "\n",
    "point_A = 6 * np.array([x_cos, y_cos, z_cos])\n",
    "print(\"The cordination of point A is: ({:.3f}, {:.3f}, {:.3f})\".format(*point_A))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.2 例2改）已知三点M(1,1,1)、A(2,2,1)以及B(2,1,2)，求角AMB的度数。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Degree of angle M is:  60.0\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "\n",
    "# Set numpy arrays for points.\n",
    "M = np.array([1,1,1])\n",
    "A = np.array([2,2,1])\n",
    "B = np.array([2,1,2])\n",
    "\n",
    "# Get numpy arrays for vectors\n",
    "MA = A - M\n",
    "MB = B - M\n",
    "\n",
    "# Get cosine value of the 2 vectors:\n",
    "cosM = np.dot(MA, MB) / (np.linalg.norm(MA) * np.linalg.norm(MB))\n",
    "M = math.degrees(math.acos(cosM))\n",
    "\n",
    "print(\"Degree of angle M is: \", round(M, 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.2 习题6）求向量a=（4,-3,4）在向量b=（2,2,1）上的投影。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The projection is: 2.000\n"
     ]
    }
   ],
   "source": [
    "import math\n",
    "import numpy as np\n",
    "\n",
    "a = np.array([4,-3,4])\n",
    "b = np.array([2,2,1])\n",
    "\n",
    "cosab = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))\n",
    "proj = np.linalg.norm(a) * cosab\n",
    "\n",
    "print(\"The projection is: %.3f\" % proj)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 向量积以及向量共面问题"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.2 例5）已知三角形三顶点A(1,2,3)、B(3,4,5)以及C(2,4,7)，求三角形面积。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Area of the triangle is: 3.742.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "A = np.array([1,2,3])\n",
    "B = np.array([3,4,5])\n",
    "C = np.array([2,4,7])\n",
    "\n",
    "area_matrix = np.cross(B-A, C-A)\n",
    "area = np.linalg.norm(area_matrix) / 2\n",
    "print(\"Area of the triangle is: %.3f.\" % area)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.2 习题10）已知OA向量为i + 3k，OB向量为j + 3k，其中i, j, k为三维空间三个方向的单位向量，求三角形OAB的面积。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Area of the triangle is: 2.179.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "OA = np.array([1,0,3])\n",
    "OB = np.array([0,1,3])\n",
    "area_matrix = np.cross(OA, OB)\n",
    "area = np.linalg.norm(area_matrix) / 2\n",
    "print(\"Area of the triangle is: %.3f.\" % area)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《高等数学》8.2 例8改）已知四点A(1,2,0)、B(2,3,1)、C(4,2,2)以及M（3,1,1），验证它们四点共面。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-0.0\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "A = np.array([1,2,0])\n",
    "B = np.array([2,3,1])\n",
    "C = np.array([4,2,2])\n",
    "M = np.array([3,1,1])\n",
    "\n",
    "matrix = np.stack((B-A,C-A,M-A))\n",
    "\n",
    "print(round(np.linalg.det(matrix),2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# numpy在线性代数中的使用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## numpy行列式计算应用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 行列式计算"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "（《工程数学 线性代数》1.1 例七）：计算行列式：（又叫计算系数行列式，英文为determinent）\n",
    "\n",
    "D = [ [3,1,-1,2],\n",
    "    [-5,1,3,-4],\n",
    "    [2,0,1,-1],\n",
    "    [1,-5,3,-3]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "40.0\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "D = [ [3,1,-1,2],\n",
    "    [-5,1,3,-4],\n",
    "    [2,0,1,-1],\n",
    "    [1,-5,3,-3]]\n",
    "# Calculate determinent using np.linalg.det\n",
    "print(round(np.linalg.det(D), 2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "改自《工程数学 线性代数》1.1\n",
    "\n",
    "例六（改）：举例说明三角行列式的系数行列式等于对角线的乘积。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "D = [ [1,0,0,0],\n",
    "    [-2,2,0,0],\n",
    "    [-3,4,-2,0],\n",
    "    [5,4,3,-7]]\n",
    "\n",
    "ret = 1\n",
    "for i in range(0, len(D)):\n",
    "    ret *= D[i][i]\n",
    "determinent = round(np.linalg.det(D), 2)\n",
    "\n",
    "print(ret == determinent)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 行列式性质讨论"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 行列式与它的转置行列式相等。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "\n",
    "# .T is the attribute of the transpose of the matrix\n",
    "print(round(np.linalg.det(D),2) == round(np.linalg.det(D.T),2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 互换行列式的两行（列），行列式变号。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original determination is: 205.99999999999986\n",
      "Determination is now: -205.99999999999986\n"
     ]
    }
   ],
   "source": [
    "# Sample 1:\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "\n",
    "print(\"Original determination is:\", np.linalg.det(D))\n",
    "\n",
    "D = np.array([ \n",
    "    [-2,2,1,3],\n",
    "    [1,2,-4,5],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "\n",
    "print(\"Determination is now:\", np.linalg.det(D))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original determination is: 205.99999999999986\n",
      "Determination is now: -205.99999999999986\n"
     ]
    }
   ],
   "source": [
    "# Sample 2:\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "\n",
    "print(\"Original determination is:\", np.linalg.det(D))\n",
    "\n",
    "D = np.array([ \n",
    "    [2,1,-4,5],\n",
    "    [2,-2,1,3],\n",
    "    [4,-3,-2,6],\n",
    "    [6,5,7,8]])\n",
    "\n",
    "print(\"Determination is now:\", np.linalg.det(D))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于此结论的推论：如果行列式有两行完全相同，则此行列式等于0也可以进行举例。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.0\n",
      "0.0\n"
     ]
    }
   ],
   "source": [
    "# Sample 1\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [1,2,-4,5],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "print(np.linalg.det(D))\n",
    "\n",
    "# Sample 2\n",
    "D = np.array([ \n",
    "    [1,1,-4,5],\n",
    "    [1,1,-4,5],\n",
    "    [-3,-3,-2,6],\n",
    "    [5,5,7,8]])\n",
    "print(np.linalg.det(D))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 行列式中的某一行（列）的所有元素都乘以同一数k，等于用数k乘此行列式。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(618.00 + 1030.00j) (618.00 + 1030.00j)\n"
     ]
    }
   ],
   "source": [
    "#Sample 1: Multiply (3 + 5j) for row 1:\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "\n",
    "D2 = np.ones_like(D, dtype=np.complex)\n",
    "D2[0] = (3 + 5j) * D[0]\n",
    "D2[1:] = D[1:].copy()\n",
    "\n",
    "print(\"({0.real:.2f} + {0.imag:.2f}j) ({1.real:.2f} + {1.imag:.2f}j)\".\n",
    "      format(np.linalg.det(D2), (3 + 5j) * np.linalg.det(D)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(618.00 + 1030.00j) (618.00 + 1030.00j)\n"
     ]
    }
   ],
   "source": [
    "#Sample 2: Multiply (3 + 5j) for column 2:\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "\n",
    "D2 = D.copy().astype(np.complex)\n",
    "D2[:,1] = (3 + 5j) * D[:,1]\n",
    "print(\"({0.real:.2f} + {0.imag:.2f}j) ({1.real:.2f} + {1.imag:.2f}j)\".\n",
    "      format(np.linalg.det(D2), (3 + 5j) * np.linalg.det(D)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 行列式中如果有两行（列）成比例，则此行列式等于零。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-0.0\n"
     ]
    }
   ],
   "source": [
    "#Sample 1: ELements of 2 columns of the matrix is are factors of each other\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,-2,8,3],\n",
    "    [-3,4,12,6],\n",
    "    [5,6,-20,8]])\n",
    "\n",
    "print(round(np.linalg.det(D),0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-0.0\n"
     ]
    }
   ],
   "source": [
    "#Sample 2: ELements of 2 rows of the matrix is are factors of each other\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,-2,8,3],\n",
    "    [-3,4,12,6],\n",
    "    [5,10,-20,40]])\n",
    "\n",
    "print(round(np.linalg.det(D),0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 若行列式的某一行（列）都是其他行列式中某一行（列）两数之和，行列式等于该行（列）分别用这两组数替换后的行列式之和。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "det(D): 206.0\n",
      "det(D1) + det(D2): 206.0\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "Sample 1: ELements in one rows equals the sum of elements of other 2 rows\n",
    "of two other matrices of the same size:\n",
    "\"\"\"\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]]) # 5 = 2 + 3, 6 = 1 + 5 and so on...\n",
    "\n",
    "print(\"det(D):\", round(np.linalg.det(D),2))\n",
    "\n",
    "D1 = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [2,1,3,4]])\n",
    "\n",
    "D2 = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [3,5,4,4]])\n",
    "\n",
    "print(\"det(D1) + det(D2):\", round(np.linalg.det(D1) + np.linalg.det(D2),2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "det(D): 206.0\n",
      "det(D1) + det(D2): 206.0\n"
     ]
    }
   ],
   "source": [
    "\"\"\"\n",
    "Sample 2: ELements in one columns equals the sum of elements of other 2 columns\n",
    "of two other matrices of the same size:\n",
    "\"\"\"\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([ \n",
    "    [1,2,-4,5],\n",
    "    [-2,2,1,3],\n",
    "    [-3,4,-2,6],\n",
    "    [5,6,7,8]])\n",
    "\n",
    "# D[:3] = D1[:3] + D2[:3] in this case.\n",
    "\n",
    "print(\"det(D):\", round(np.linalg.det(D),2))\n",
    "\n",
    "D1 = np.array([ \n",
    "    [1,2,-4,1],\n",
    "    [-2,2,1,2],\n",
    "    [-3,4,-2,3],\n",
    "    [5,6,7,4]])\n",
    "\n",
    "D2 = np.array([ \n",
    "    [1,2,-4,4],\n",
    "    [-2,2,1,1],\n",
    "    [-3,4,-2,3],\n",
    "    [5,6,7,4]])\n",
    "\n",
    "print(\"det(D1) + det(D2):\", round(np.linalg.det(D1) + np.linalg.det(D2),2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 把行列式的某一行（列）各元素乘以同一数然后加到另一行（列）对应元素上，行列式不变。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "det(D): 40.0\n",
      "[[ 3  1 -1  2]\n",
      " [-5  1  3 -4]\n",
      " [ 2  0  1 -1]\n",
      " [16  0 -2  7]]\n",
      "det(D1): 40.0\n"
     ]
    }
   ],
   "source": [
    "# Sample 1: Multiply certain row by a factor, add to another row:\n",
    "import numpy as np\n",
    "\n",
    "D = np.array([\n",
    "    [3,1,-1,2],\n",
    "    [-5,1,3,-4],\n",
    "    [2,0,1,-1],\n",
    "    [1,-5,3,-3]\n",
    "])\n",
    "\n",
    "print(\"det(D):\", np.linalg.det(D))\n",
    "\n",
    "# Do operation (r4=,but usually omit)r4(row4) + 5r1:\n",
    "D1 = D.copy()\n",
    "D1[3] = D1[0] * 5 + D1[3]\n",
    "print(D1)\n",
    "\n",
    "print(\"det(D1):\", round(np.linalg.det(D1), 1))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 求解方程组"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "改自《工程数学 线性代数》1.1\n",
    "\n",
    "例一：求二元线性方程组：\n",
    "\n",
    "3x - 2y = 12\n",
    "\n",
    "2x + y = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "x = 2.0\n",
      "y = -3.0\n"
     ]
    }
   ],
   "source": [
    "# Solution: np.linalg.solve\n",
    "import numpy as np\n",
    "\n",
    "# coefs stands for coefficients.\n",
    "coefs = [[3, -2], [2, 1]]\n",
    "orientates = [12, 1]\n",
    "\n",
    "solutions = np.linalg.solve(coefs, orientates)\n",
    "\n",
    "counter = 0\n",
    "for eachSolution in solutions:\n",
    "    print(chr(ord('x') + counter) + \" = \" + str(round(eachSolution, 2)))\n",
    "    counter += 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 绘制曲面"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用numpy绘制曲面需要一些坐标转换知识。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Dev_Tools\\Anaconda\\lib\\site-packages\\ipykernel_launcher.py:9: RuntimeWarning: invalid value encountered in sqrt\n",
      "  if __name__ == '__main__':\n",
      "C:\\Dev_Tools\\Anaconda\\lib\\site-packages\\numpy\\core\\_methods.py:29: RuntimeWarning: invalid value encountered in reduce\n",
      "  return umr_minimum(a, axis, None, out, keepdims)\n",
      "C:\\Dev_Tools\\Anaconda\\lib\\site-packages\\numpy\\core\\_methods.py:26: RuntimeWarning: invalid value encountered in reduce\n",
      "  return umr_maximum(a, axis, None, out, keepdims)\n",
      "C:\\Dev_Tools\\Anaconda\\lib\\site-packages\\matplotlib\\colors.py:489: RuntimeWarning: invalid value encountered in less\n",
      "  np.copyto(xa, -1, where=xa < 0.0)\n"
     ]
    },
    {
     "data": {
      "image/png": "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vY+77747ZyRfybquQXEpOjhrLadOneLAgQOsXbuWNWvWsH79+mUZv5wPXDMzM7kf6rvf/W4ajcZl3fd8doplEs0DDzyQu5JcrDwoNk/Avr9w0oSaybuuaNjbi0GlQc7KtKnKO8q4CUFFuROyRlUtlbGMeDok6YioPJ7R9KfII5DiNrk1WVAtTtCVETECB3JvUxX6faaMMb3Jtwq85ZwYficurNcHEof1wme07C2qQgOpdsdRvMcGo6BmAT/lv25L2sii87KZc8hpu59TNgfGtFvsO7OuJho1AnSZLnV6qgSIFMzZ/I9lHSAqwiFIHakoajinIZQjPcnXpeOU276zNrH8rzxGDerFxYBVFPrJTPIkp8frfO//WsXGz57/7rnyFQQBWms2bdqUf4bLgvlz585x6NAhkiQZYGx6h57lWMlkWfZ9kaV4sZzE2erpp5++wBTc/+zWrVt56KGHeOWVV94Bxe+38v6oo6Oj3H///VSrVV5//fVli4/y41NP3un3++zYsWNJnCbmGp/ORqJZyP3++YddcLCyKJSMTiNL0sWdHC1xE0BBUIwWhSzicgcbDjATlZ/PRS5RAF7aE1KODslP4GlXoauAFT1g5HaHabfkQZqK8TVKwMiL5YGB7qa6orCf8+NdYEDmoXRxYswZmXnuogC970AHANDa3KLNJDYHj6RddIVJS+cON1lPwDjrK+lcu8W4NJnxe0vrmKwlRqpy7jexJnBhw1k/QAUGVTOYTkTa9oScgLhVjJRtUrauUwR1k5snqEhA1WYKk8pONG3LcfquMutoN0aF3owmqhsyAvb90Ri7f7bP6I3zelsta51P/CkL5tevX5//TJmxefz48XkZey+msiy7op3p+TXfTnHXrl3s3buXgwcPcuONN/L000/zpS996YKfe+utt5icnOS9731v/rXJyUkajQbVapWzZ8/yzW9+k8cff3xJn8d867oGxcW+WX2HFobhBf6oy5mpaIxhZmaGV199dcnIO74uNj71JJqpqSl27NhxAeNsrtJac/YNxZFviAaguso4DZsDNE+OyZMbLLqSYroRKoTKENIBRgIYgloq36+ZRKQAKGGsRkOQaUvWFZDMEpUTVcRDVADEN8U6KliZKiBnZQYR+LCjcppFOc6J0i7P6x39LlPur7gNHjiVA45iP6h0cTusm3ycWhk1rqtV6NDkIOo7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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x286d52ef5f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 快速广播数组生成的数据作三维曲面图：\n",
    "import numpy as np\n",
    "import pylab as pl\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "\n",
    "fig = pl.figure()\n",
    "ax = Axes3D(fig)\n",
    "x, y = np.ogrid[-5:5:100j, -5:5:100j]\n",
    "z = np.sqrt(5 - np.sqrt((x - 1) **2) - np.sqrt((y + 2) ** 2))\n",
    "\n",
    "ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='rainbow')\n",
    "pl.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sympy计算示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求极限"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1/6"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x')\n",
    "limit((x - 3) / (x ** 2 - 9), x, 3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0\n",
      "1\n",
      "<-1, 1>\n"
     ]
    }
   ],
   "source": [
    "print(limit(sin(x) / x, x, oo))\n",
    "print(limit(sin(x) / x, x, 0))\n",
    "k = limit(sin(1 / x), x, 0)\n",
    "type(k)\n",
    "print(k)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "limit((3 * x ** 2 - 2 * x - 1) / (2 * x ** 3 - x ** 2 + 5), x, oo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "oo"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "limit((2 * x ** 3 - x ** 2 + 5) / (3 * x ** 2 - 2 * x - 1), x, oo)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "limit(tan(x) / x, x, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "limit(asin(x) / x, x, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "E"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "limit(pow(1 + x, 1 / x), x, 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-0.0833333333333333"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "limit( (1 + 1 / 2 * x ** 2 - ((1 + x ** 2) ** (1 / 2))) / \n",
    "      ((cos(x) - E ** (x ** 2)) * sin(x ** 2)), x, 0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求微分（diff）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一些基本例子如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a**x*log(a)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x, a = symbols('x a')\n",
    "diff(a ** x, x)\n",
    "# log means ln in this case, which is the natural logrithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1/(x*log(a))"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diff(log(x, a), x)\n",
    "# log means ln in this case, which is the natural logrithm."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [],
   "source": [
    "log?"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.166666666666667*x**(-0.833333333333333)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "diff((x ** 2 * x ** (2 / 3)) / (x ** (5 / 2)), x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "tan(x)*sec(x)\n",
      "-cot(x)**2 - 1\n",
      "-cot(x)*csc(x)\n",
      "1/sqrt(-x**2 + 1)\n",
      "-1/sqrt(-x**2 + 1)\n",
      "1/(x**2 + 1)\n"
     ]
    }
   ],
   "source": [
    "print(diff(sec(x), x))\n",
    "print(diff(cot(x), x))\n",
    "print(diff(csc(x), x))\n",
    "print(diff(asin(x), x))\n",
    "print(diff(acos(x), x))\n",
    "print(diff(atan(x), x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 高阶求导示例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-w**2*sin(t*w)\n"
     ]
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x, w, t, n = symbols('x w t n')\n",
    "print(diff(sin(w * t), t, 2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-cos(x)\n",
      "sin(x)\n",
      "24/(x + 1)**5\n",
      "1048576*(x**2 + 20*x + 95)*exp(2*x)\n"
     ]
    }
   ],
   "source": [
    "# Cannot be nth derivative unfortunately\n",
    "print(diff(sin(x), x, 3))\n",
    "print(diff(sin(x), x, 4))\n",
    "print(diff(log(1 + x), x, 5))\n",
    "print(diff(x ** 2 * (E ** (2 * x)), x, 20))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cosh(x)\n",
      "1/sqrt(x**2 - 1)\n"
     ]
    }
   ],
   "source": [
    "print(diff(sinh(x)))\n",
    "print(diff(acosh(x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1.0*x*(x**2 - 1)**(-0.5) + 1)/(x + (x**2 - 1)**0.5)\n"
     ]
    }
   ],
   "source": [
    "print(diff(log(x + pow(x ** 2 - 1, 0.5))))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求泰勒展开式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1 + x + x**2/2 + x**3/6 + x**4/24 + x**5/120 + x**6/720 + x**7/5040 + x**8/40320 + x**9/362880 + O(x**10)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x')\n",
    "expression = series(exp(x),x,0,10)\n",
    "expression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "x - x**3/6 + x**5/120 - x**7/5040 + x**9/362880 + O(x**10)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "series(sin(x),x,0,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1 - x**2/2 + x**4/24 - x**6/720 + x**8/40320 + O(x**10)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "series(cos(x),x,0,10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "x - x**2/2 + x**3/3 - x**4/4 + x**5/5 - x**6/6 + x**7/7 - x**8/8 + x**9/9 + O(x**10)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "series(log(1 + x),x,0,10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 求不定积分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "log(x)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x')\n",
    "integrate(1 / x, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-4*cos(x)/sin(x)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integrate(1 / ( pow(sin(x / 2), 2) * pow(cos(x / 2), 2) ), x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2*x**3/3 - x + 4*atan(x)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integrate((2 * x ** 4 + x ** 2 + 3) / (x ** 2 + 1), x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 第一类换元法积分示例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4*x + 6)/(x**2 + 4*x + 4) + log(x + 2)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x, a = symbols('x, a')\n",
    "integrate(x ** 2 / (x + 2) ** 3, x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "sin(x)**7/7 - 2*sin(x)**5/5 + sin(x)**3/3"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integrate( pow(sin(x), 2) * pow(cos(x), 5), x )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**对于积分结果可能涉及对数或正余弦之外的三角函数的积分，需要使用integrals.manualintegrate得出正确结果**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-log(sin(x)**2 - 1)/2\n",
      "-log(cos(x))\n"
     ]
    }
   ],
   "source": [
    "# This might be the answer not simplified:\n",
    "print(integrate(tan(x), x))\n",
    "\n",
    "# This presents the correct answer:\n",
    "print(integrals.manualintegrate(tan(x), x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "log(sin(x))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integrals.manualintegrate(cot(x), x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tan(x)**5/5 + 2*tan(x)**3/3 + tan(x)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "integrals.manualintegrate(pow(sec(x), 6), x)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**对于积分结果为反三角函数的积分，还要尤其注意常量的取值范围。**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "atan(x/2)/2\n",
      "atan(x/Abs(a))/Abs(a)\n"
     ]
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x', real=True)\n",
    "a = symbols('a', real=True, nonzero=True)\n",
    "print(integrate(1 / (4 + x ** 2), x))\n",
    "print(integrals.manualintegrate(1 / (a ** 2 + x ** 2), x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "asin(x/a)\n",
      "asin(x/a)\n"
     ]
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x', real=True)\n",
    "a = symbols('a', positive=True)\n",
    "\n",
    "print(integrate(1 / sqrt(a ** 2 - x ** 2), x))\n",
    "print(integrals.manualintegrate(1 / sqrt(a ** 2 - x ** 2), x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Piecewise((-acoth(x/Abs(a))/Abs(a), x**2 > a**2), (-atanh(x/Abs(a))/Abs(a), x**2 < a**2))\n",
      "-acoth(x/Abs(a))/Abs(a)\n",
      "log(-a + x)/(2*a) - log(a + x)/(2*a)\n"
     ]
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x', real=True)\n",
    "a = symbols('a', real=True, nonzero=True)\n",
    "\n",
    "rets = integrals.manualintegrate(1 / (x ** 2 - a ** 2), x)\n",
    "print(rets)\n",
    "print(rets.args[0][0])\n",
    "\n",
    "print(integrate(1 / (x ** 2 - a ** 2), x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 第二类换元法积分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "a**2*asin(x/a)/2 + x*sqrt(a**2 - x**2)/2"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sympy import *\n",
    "\n",
    "x = symbols('x')\n",
    "a = symbols('a', positive=True)\n",
    "integrate(sqrt(a ** 2 - x ** 2), x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "asinh(x/a)\n",
      "acosh(x/a)\n"
     ]
    }
   ],
   "source": [
    "print(integrate(1 / sqrt(x ** 2 + a ** 2), x))\n",
    "print(integrate(1 / sqrt(x ** 2 - a ** 2), x))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 参考资料"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- http://docs.sympy.org/latest/tutorial/intro.html\n",
    "- 疑难sympy运算（Sympy Gamma）网址：http://gamma.sympy.org/input/?i=integrate%28tan%28x%29%2C%20%28x%2C%200%2C%20pi/2%29%29\n",
    "\n",
    "《高等数学》"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "247px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
